package br.org.mestrado.vais.comparator;

import br.org.mestrado.vais.Anticorpo;

public class ParetoComparator extends ParetoCompare {

	public ParetoComparator(final int c) {
		super(c);
	}

	@Override
	public int compare(Anticorpo arg0, Anticorpo arg1) {
		// mesmo fitness entre elas. compara
		// quantos objetivos cada uma é melhor

		int arg0melhor = 0, arg1melhor = numObjetivos;

		final double[] acCopy0 = modifyPareto(arg0.getObjectives());

		final double[] acCopy1 = modifyPareto(arg1.getObjectives());

		// Verifica se arg0 domina arg1
		// arg0 domina arg1 se e somente se
		// arg0 não for pior que arg1 em todos os
		// objetivos e for melhor em pelo menos 1 objetivo
		for (int pointer = 0; pointer < numObjetivos; pointer++) {

			// conta em quantos objetivos que arg0 é melhor que arg1
			if (acCopy0[pointer] < acCopy1[pointer]) {
				++arg0melhor;
			} else {
				if (acCopy0[pointer] == acCopy1[pointer]) {
					--arg1melhor;
				}
			}
		}

		if (arg0melhor != 0 || arg1melhor != 0)
			if (arg0melhor > arg1melhor)
				return -1;
			else if (arg0melhor < arg1melhor)
				return 1;

		return 0;
	}

}
